package com.plugin.manage.service;

import com.plugin.core.model.entity.SysRole;
import com.plugin.core.model.entity.SysMenu;
import com.plugin.core.model.entity.SysPermission;

import java.util.List;

/**
 * 系统角色服务接口
 * 
 * @author mark
 * @date 2025-07-28
 */
public interface ISysRoleService {

    /**
     * 新增角色
     * 
     * @param sysRole 角色信息
     * @return 角色ID
     */
    Long addRole(SysRole sysRole);

    /**
     * 删除角色
     * 
     * @param roleId 角色ID
     * @return 是否成功
     */
    boolean deleteRole(Long roleId);

    /**
     * 批量删除角色
     * 
     * @param roleIds 角色ID列表
     * @return 删除成功的数量
     */
    int batchDeleteRole(List<Long> roleIds);

    /**
     * 更新角色
     * 
     * @param sysRole 角色信息
     * @return 是否成功
     */
    boolean updateRole(SysRole sysRole);

    /**
     * 根据ID查询角色
     * 
     * @param roleId 角色ID
     * @return 角色信息
     */
    SysRole getRoleById(Long roleId);

    /**
     * 根据用户ID和角色ID查询角色
     * 
     * @param userId 用户ID
     * @param roleId 角色ID
     * @return 角色信息
     */
    SysRole getRoleByUserIdAndRoleId(Long userId, Long roleId);

    /**
     * 分页查询角色列表
     * 
     * @param offset 偏移量
     * @param limit 限制数量
     * @param sysRole 查询条件
     * @return 角色列表
     */
    List<SysRole> getRoleList(int offset, int limit, SysRole sysRole);

    /**
     * 查询所有角色
     * 
     * @return 角色列表
     */
    List<SysRole> getAllRoles();

    /**
     * 统计角色数量
     * 
     * @param sysRole 查询条件
     * @return 角色数量
     */
    Integer countRoles(SysRole sysRole);

    /**
     * 检查角色名称是否存在
     * 
     * @param roleName 角色名称
     * @param roleId 角色ID（编辑时排除自己）
     * @return 是否存在
     */
    boolean checkRoleNameExists(String roleName, Long roleId);

    /**
     * 检查角色标识是否存在
     * 
     * @param roleKey 角色标识
     * @param roleId 角色ID（编辑时排除自己）
     * @return 是否存在
     */
    boolean checkRoleKeyExists(String roleKey, Long roleId);

    /**
     * 获取角色权限列表
     * 
     * @param roleId 角色ID
     * @return 权限列表
     */
    List<SysMenu> getRolePermissions(Long roleId);

    /**
     * 保存角色权限
     * 
     * @param roleId 角色ID
     * @param menuIds 菜单ID字符串，逗号分隔
     * @return 是否成功
     */
    boolean saveRolePermissions(Long roleId, String menuIds);

    /**
     * 批量删除角色
     * 
     * @param roleIds 角色ID数组
     * @return 删除成功的数量
     */
    int batchDeleteRoles(Long[] roleIds);

    /**
     * 导出角色数据
     * 
     * @param queryRole 查询条件
     * @return 角色列表
     */
    List<SysRole> exportRoles(SysRole queryRole);

    /**
     * 获取角色选择列表
     * 
     * @return 角色选择项列表
     */
    List<SysRole> getRoleSelectList();
}
